# -*- coding: utf-8 -*-

from django.db import models
#from pyexpat import model
import datetime
from datetime import datetime, timedelta
#from django import forms
from django.core.files.storage import FileSystemStorage
from django.contrib.auth.models import User
from django.utils.datetime_safe import date
import re
#from django.contrib.auth import user_logged_in
#from django.db.models.query_utils import Q
#from Classi180.classificados import threadlocals
#from django.contrib.comments.models import Comment



file_storage = FileSystemStorage(location='D:/Desenvolvimento/Projetos/Classi180/Classi180/media/')
STATUS_CHIOCES = (

               (0, 'Cancelado'),
               (1, 'Fechado'),
               (2, 'Aberto'),
               (3, 'Vendido'),
               (4, 'Especial'),
           )
ACAO_CHOICES =(

               ('0', 'Cancelado'),
               ('1', 'Fechado'),
               )
TIPO_CHOICES = (
                (0,'Novo'),
                (1,'Usado'),
        )

ESTADOS_CHIOCES = (

               ('AC', 'Acre'),
               ('AL', 'Alagoas'),
               ('AP', 'Amapá'),
               ('AM', 'Amazonas'),
               ('BA', 'Bahia'),
               ('CE', 'Ceará'),
               ('DF', 'Distrito Federal'),
               ('ES', 'Espírito Santo'),
               ('GO', 'Goiás'),
               ('MA', 'Maranhão'),
               ('MT', 'Mato Grosso'),
               ('MS', 'Mato Grosso do Sul'),
               ('MG', 'Minas Gerais'),
               ('PA', 'Pará'),
               ('PB', 'Paraiba'),
               ('PR', 'Parana'),
               ('PE', 'Pernambuco'),
               ('PI', 'Piauí'),
               ('RJ', 'Rio de Janeiro'),
               ('RN', 'Rio Grande do Norte'),
               ('RS', 'Rio Grande do Sul'),
               ('RO', 'Rondônia'),
               ('RR', 'Roraima'),
               ('SC', 'Santa Catarina'),
               ('SP', 'São Paulo'),
               ('SE', 'Sergipe'),
               ('TO', 'Tocantins'),

               )

class Cidade(models.Model):
    nome = models.CharField('Cidade',max_length = 25)
    estado = models.CharField('Estado',max_length = 2, choices = ESTADOS_CHIOCES)
    def __unicode__(self):
        return self.nome

class Categoria(models.Model):
    nome = models.CharField('Categoria', max_length = 15)
    dataCadastro = models.DateTimeField('Data de Cadastro', default = datetime.now(),blank=True)
    def __unicode__(self):
        return self.nome

class TagBusca(models.Model):
    tag = models.CharField(max_length = 30)
    quantidade = models.IntegerField(default = 0, null = True)
    def __unicode__(self):
        return self.tag
    
class Usuario(models.Model):
    nome = models.CharField('Nome', max_length = 50 )
    user = models.ForeignKey(User, null = True)
    cpf = models.CharField(max_length = 15, unique = True)
    email = models.EmailField(max_length = 75, unique = True)
    endereco = models.CharField(max_length = 255, blank=True, null=True)
    cidade = models.ForeignKey(Cidade)
    cep = models.CharField(max_length = 9)
    telefone = models.CharField(max_length = 35)
    foto = models.ImageField(upload_to='users/foto', null=True, blank=True)
    thumbnail = models.ImageField(upload_to='users/thumbnail', null=True, blank=True)
    dataCadastro = models.DateTimeField('Data de Cadastro', default = datetime.now(),blank=True)
    quantidadeAcesso = models.IntegerField(default = 0, editable = False)
    status = models.BooleanField(default=1, blank=True)
    senha = models.CharField(max_length = 30)
    def __unicode__(self):
        return self.nome

class SubCategoria(models.Model):
    id = models.AutoField(primary_key = True)
    nome = models.CharField('Sub Categoria', max_length = 25)
    categoria = models.ForeignKey(Categoria)
    dataCadastro = models.DateTimeField('Data de Cadastro', default = datetime.now(),blank=True)
    def __unicode__(self):
        return self.nome

def content_file_name(instance, filename):
    return '/'.join(['anuncio', str(instance.categoria.id),str(instance.subcategoria.id), filename])

def content_image_name(instance, filename):
    return '/'.join(['anuncio', str(instance.anuncio.categoria.id),str(instance.anuncio.subcategoria.id), filename])

def content_choices_id(instance):
    return instance.categoria.subcategoria_set.all()

class Anuncio(models.Model):
    descricao = models.CharField('Descricao', max_length = 60)
    usuario = models.ForeignKey(Usuario, null = True)
    categoria = models.ForeignKey(Categoria)
    subcategoria = models.ForeignKey(SubCategoria)#, limit_choices_to=content_choices_id) #dict(Q(SubCategoria.objects.filter(categoria==threadlocals.get_current_categoria))))
    cidade = models.ForeignKey(Cidade, null = True)
    detalhes = models.TextField()
    tipo = models.SmallIntegerField(default=1, blank=False, editable = False, choices = TIPO_CHOICES)
    tags = models.CharField('Palavras-Chaves', max_length = 70)
    foto = models.ImageField(upload_to=content_file_name, null=True, blank=True)
    video = models.CharField(max_length = 100, null = True, blank = True)
    thumbnail = models.ImageField(upload_to=content_file_name, null=True, blank=True, editable = False)
    dataCadastro = models.DateTimeField('Data de Cadastro', default = datetime.now(),blank=True)
    dataSaida = models.DateTimeField(null=True, editable = False)
    status = models.SmallIntegerField(default=1, blank=False, choices = STATUS_CHIOCES)
    quantidadeFoto = models.SmallIntegerField(default = 0, blank = True)
    quantidadeAcesso = models.IntegerField(default = 0, editable = False)
    preco = models.DecimalField(max_digits=10, decimal_places=2)
    modified = models.BooleanField(editable = False, default = False)
    
    @property
    def titulo(self):
        return self.descricao
    @property
    def texto(self):
        return self.detalhes
    @property
    def is_modified(self):
        return self.modified
    @property
    def estado(self):
        return self.status
    
    def __unicode__(self):
        return self.descricao
    
    def site(self):
        return self.categoria

    def get_absolute_url(self):
        return '/anuncio/%d/'%self.id
    
    def data_saida(self):
        self.dataSaida = self.dataCadastro + timedelta(15)
        
    def faltaTempo(self):
        return self.dataSaida - datetime.today()
    
    def save(self, force_save=False, force_update=False):
        self.data_saida()
        if self.foto != None and self.quantidadeFoto==0:
            self.quantidadeFoto +=1
        super(Anuncio,self).save(force_save,force_update)
        
    def tamanho_imagem(self):
        self.foto.size(200,200)
        return self.foto.name
        
    def categoria_do_anuncio(self):
        categoria = Categoria.objects.get(id=self.subcategoria.categoria_id)
        #sub = SubCategoria.objects.filter(categoria__exact = cat).values('id')
        return self.categoria.subcategoria_set.all()

class TagAnuncio(models.Model):
    anuncio = models.ForeignKey(Anuncio)
    tag = models.ForeignKey(TagBusca)
    
class TagUsuario(models.Model):
    usuario = models.ForeignKey(Usuario)
    tag = models.ForeignKey(TagBusca)
    
class Pacote(models.Model):
    descricao = models.CharField(max_length = 100)
    preco = models.DecimalField(max_digits=10, decimal_places=2)
    def __unicode__(self):
        return 'Pacote '+str(self.id)
    
class Blog(models.Model):
    titulo = models.CharField(max_length = 35)
    user = models.ForeignKey(User, null = True)
    def __unicode__(self):
        return self.titulo

class Contrato(models.Model):
    pacote = models.ForeignKey(Pacote)
    anuncio = models.ForeignKey(Anuncio)
    semanas = models.SmallIntegerField()
    dataCadastro = models.DateField('Data de Cadastro', default = date.today(),blank=True)    
    dataSaida = models.DateField(null=True, editable = False)
    blog = models.ForeignKey(Blog, null = True)
    valor = models.DecimalField(max_digits=10, decimal_places=2)
    def __unicode__(self):
        return 'Pacote: '+self.pacote+' - Anuncio: '+str(self.anuncio.descricao)
    
    #def data_saida(self, semanas):
    #    dias = semanas*8
    #    self.dataSaida = self.dataCadastro + timedelta(dias)
        
    def faltaTempo(self):
        return self.dataSaida - date.today()
    
    def save(self, force_save=False, force_update=False):
        self.valor = self.pacote.preco*self.semanas
        super(Contrato,self).save(force_save,force_update)

class AvaliacaoUsuario(models.Model):
    avaliado = models.ForeignKey(Usuario)
    avaliacaoPositiva = models.BooleanField()
    avaliacaoNegativa = models.BooleanField()
    avaliador = models.ForeignKey(Usuario, related_name = 'avaliador')
    media = models.FloatField()
    def __unicode__(self):
        return self.avaliado.nome+' - '+self.avaliador.nome+': '+str(self.media)

class Proibidas(models.Model):
    class Meta:
        verbose_name_plural = "Palavras Proibidas"
        verbose_name = "Palavra Proibida"
    palavra = models.CharField('Palavra',max_length=25)
    acao = models.CharField(help_text='Ação a ser realizada quando houver ocorrência',max_length=2,default='1', blank=True, choices = ACAO_CHOICES)
    def __unicode__(self):
        return self.palavra
    
class Regra(models.Model):
    palavra = models.ForeignKey(Proibidas)
    prefixo = models.CharField(help_text='Digitar os caracteres para ativar a regra quando ocorrerem antes da palavra',max_length=10)
    entreLetras = models.CharField(help_text='Digitar os caracteres para ativar a regra quando ocorrerem entre as letras da palavra',max_length=10)
    sufixo = models.CharField(help_text='Digitar os caracteres para ativar a regra quando ocorrerem depois da palavra',max_length=10)
    acao =  models.CharField(help_text='Ação a ser realizada quando houver ocorrência',max_length=2, blank=True, choices = ACAO_CHOICES)
    def __unicode__(self):
        return self.palavra.palavra
    
class Imagem (models.Model):
    nome = models.CharField('Nome',max_length=25)
    anuncio = models.ForeignKey(Anuncio)
    foto = models.ImageField(upload_to=content_image_name, null=True, blank=True)    
    dataCadastro = models.DateField('Data de Cadastro', default = datetime.today(),blank=True)
    def __unicode__(self):
        return self.nome
    def save(self, force_save = False, force_update = False):
        objetoAnuncio = Anuncio.objects.get(id = self.anuncio.id)
        if objetoAnuncio.quantidadeFoto<10:
            objetoAnuncio.quantidadeFoto +=1
            objetoAnuncio.save()
            super(Imagem,self).save(force_save, force_update)
        else:
            return 'Quantidade de Imagem excedeu o limite!'
    